package com.cmo.common.calling.controller;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.cmo.common.model.Pager;
import com.cmo.common.model.PatientQueue;
import com.cmo.common.model.QueueType;
import com.cmo.common.model.Triage;
import com.cmo.common.utils.Shared;
import com.cmo.common.utils.ToolString;
import com.jfinal.core.Controller;
import com.jfinal.plugin.activerecord.Record;

public class CallingPatientQueueController extends Controller {
	PatientQueue servicepatientqueue=new PatientQueue();
	Shared shared=new Shared();
	Pager pager=new Pager();
	Triage triage=new Triage();
	QueueType queuetype=new QueueType();
	
	//查询是否有未更改状态的患者
	public void list_state_patient(){
		Map<String, Object> map=new HashMap<String, Object>();
		
		String pager_ip=shared.getIpAddr(getRequest());
		if(ToolString.isBlank(pager_ip)){
			map.put("return_code", "fail");
			map.put("return_msg", "获取pager_ip失败");
			renderJson(map);
			return;
		}
		String login_id=getPara("login_id");
		if(ToolString.isBlank(login_id)){
			map.put("return_code", "fail");
			map.put("return_msg", "获取login_id失败");
			renderJson(map);
			return;
		}
		//分诊台分诊模式 triage_type 1按医生 2按叫号器
		//根据医生工号查询分诊台分诊模式
		Record rt= triage.findtypelogin_id(login_id);
		if(null==rt){
			map.put("return_code", "fail");
			map.put("return_msg", "查询分诊台分诊模式失败");
			renderJson(map);
			return;
		}
		//获取分诊台分针模式
		String type=rt.get("triage_type").toString();
		Record rd= servicepatientqueue.select_state_patient(pager_ip, login_id,type);
		if(null!=rd){
			map.put("return_code", "fail");
		      map.put("return_msg", "\"" + rd.get("patient_name") + "\"患者未进行诊结，过号操作，不能呼叫下一患者");
		      map.put("patient_name", rd.get("patient_name"));
		      renderJson(map);
			return;
		}else{
			map.put("return_code", "success");
			map.put("return_msg", "可以进行呼叫操作");
			renderJson(map);
		}
		renderJson(map);
		
	}
	
	//等候患者信息列表
	public void list_patient(){
		Map<String, Object> map=new HashMap<String, Object>();
		
		String ip=shared.getIpAddr(getRequest());
		Record rpager = pager.queryByPagetToIP(ip);
	    if (rpager.get("doctor_id") == null)
	    {
	      map.put("return_code", "loginout");
	      map.put("return_msg", "loginout");
	      renderJson(map);
	      return;
	    }
	    int doctor_id=rpager.getInt("doctor_id");
		//获取登陆的队列id
		String queue_type_id=getPara("queue_type_id").toString();
		if(ToolString.isBlank(queue_type_id)){
			map.put("return_code", "fail");
			map.put("return_msg", "获取队列ID失败");
			renderJson(map);
			return;
		}
		String login_id=getSessionAttr("login_id").toString();
		if(ToolString.isBlank(login_id)){
			map.put("return_code", "fail");
			map.put("return_msg", "获取医生登陆工号失败");
			renderJson(map);
			return;
		}
		//分诊台分诊模式 triage_type 1按医生 2按叫号器
		//根据医生工号查询分诊台分诊模式
		Record rt= triage.findtypelogin_id(login_id);
		if(null==rt){
			map.put("return_code", "fail");
			map.put("return_msg", "查询分诊台分诊模式失败");
			renderJson(map);
			return;
		}
		//获取分诊台分针模式
		String type=rt.get("triage_type").toString();
		
		List<Record> list=servicepatientqueue.list_call_patient(login_id,Integer.parseInt(queue_type_id),type,ip,doctor_id);
		
		if(null==list){
			map.put("return_code", "fail");
			map.put("return_msg", "获取患者信息失败");
			renderJson(map);
			return;
		}else{
			map.put("return_code", "success");
			map.put("return_msg", "获取患者信息成功");
			map.put("list", list);
			map.put("count", list.size());
			renderJson(map);
		}
		renderJson(map);
	}
	
	//叫号器过号患者列表
	public void list_patient_pass(){
		Map<String, Object> map=new HashMap<String, Object>();
		Record rpager = pager.queryByPagetToIP(shared.getIpAddr(getRequest()));
	    if (rpager.get("doctor_id") == null)
	    {
	      map.put("return_code", "loginout");
	      map.put("return_msg", "loginout");
	      renderJson(map);
	      return;
	    }
		//获取登陆的队列id
		String queue_type_id=getPara("queue_type_id").toString();
		
		if(ToolString.isBlank(queue_type_id)){
			map.put("return_code", "fail");
			map.put("return_msg", "获取队列ID失败");
			renderJson(map);
			return;
		}
		//分诊台分诊模式 triage_type 1按医生 2按叫号器
				//根据医生工号查询分诊台分诊模式
		String login_id=getSessionAttr("login_id").toString();
		if(ToolString.isBlank(login_id)){
			map.put("return_code", "fail");
			map.put("return_msg", "获取session中的login_id失败");
			renderJson(map);
			return;
		}
		Record rt= triage.findtypelogin_id(login_id);
		if(null==rt){
			map.put("return_code", "fail");
			map.put("return_msg", "查询分诊台分诊模式失败");
			renderJson(map);
			return;
		}
		//获取分诊台分针模式
		String type=rt.get("triage_type").toString();
		
		String pager_ip=shared.getIpAddr(getRequest());
		//查询患者信息
		List<Record> list=servicepatientqueue.list_call_patient_pass(Integer.parseInt(queue_type_id),pager_ip,type,login_id);
		if(null==list){
			map.put("return_code", "fail");
			map.put("return_msg", "获取患者信息失败");
			renderJson(map);
			return;
		}else{
			map.put("return_code", "success");
			map.put("return_msg", "获取患者信息成功");
			map.put("list", list);
			map.put("count", list.size());
			renderJson(map);
		}
		renderJson(map);
	}


	//叫号器已就诊患
	public void list_patient_over(){
		Map<String, Object> map=new HashMap<String, Object>();
		Record rpager = pager.queryByPagetToIP(shared.getIpAddr(getRequest()));
	    if (rpager.get("doctor_id") == null)
	    {
	      map.put("return_code", "loginout");
	      map.put("return_msg", "loginout");
	      renderJson(map);
	      return;
	    }
	    int doctor_id=rpager.getInt("doctor_id");
		//获取登陆的队列id
		String queue_type_id=getPara("queue_type_id").toString();
		if(ToolString.isBlank(queue_type_id)){
			map.put("return_code", "fail");
			map.put("return_msg", "获取队列ID失败");
			renderJson(map);
			return;
		}
		//分诊台分诊模式 triage_type 1按医生 2按叫号器
		//根据医生工号查询分诊台分诊模式
		String login_id=getSessionAttr("login_id").toString();
		if(ToolString.isBlank(login_id)){
			map.put("return_code", "fail");
			map.put("return_msg", "获取session中的login_id失败");
			renderJson(map);
			return;
		}
		Record rt= triage.findtypelogin_id(login_id);
		if(null==rt){
			map.put("return_code", "fail");
			map.put("return_msg", "查询分诊台分诊模式失败");
			renderJson(map);
			return;
		}
		//获取分诊台分针模式
		String type=rt.get("triage_type").toString();
		
		String pager_ip=shared.getIpAddr(getRequest());
		
		//查询患者信息
		List<Record> list=servicepatientqueue.list_call_patient_over(Integer.parseInt(queue_type_id),pager_ip,type,login_id,doctor_id);
		if(null==list){
			map.put("return_code", "fail");
			map.put("return_msg", "获取患者信息失败");
			renderJson(map);
			return;
		}else{
			map.put("return_code", "success");
			map.put("return_msg", "获取患者信息成功");
			map.put("list", list);
			map.put("count", list.size());
			renderJson(map);
		}
		renderJson(map);
	}


	//未到过号患者
	public void list_patient_was(){
		Map<String, Object> map=new HashMap<String, Object>();
		Record rpager = pager.queryByPagetToIP(shared.getIpAddr(getRequest()));
	    if (rpager.get("doctor_id") == null)
	    {
	      map.put("return_code", "loginout");
	      map.put("return_msg", "loginout");
	      renderJson(map);
	      return;
	    }
		//获取登陆的队列id
		String queue_type_id=getPara("queue_type_id").toString();
		if(ToolString.isBlank(queue_type_id)){
			map.put("return_code", "fail");
			map.put("return_msg", "获取队列ID失败");
			renderJson(map);
			return;
		}
		//分诊台分诊模式 triage_type 1按医生 2按叫号器
		//根据医生工号查询分诊台分诊模式
		String login_id=getSessionAttr("login_id").toString();
		//String login_id=getPara("login_id");
		if(ToolString.isBlank(login_id)){
			map.put("return_code", "fail");
			map.put("return_msg", "获取session中的login_id失败");
			renderJson(map);
			return;
		}
		Record rt= triage.findtypelogin_id(login_id);
		if(null==rt){
			map.put("return_code", "fail");
			map.put("return_msg", "查询分诊台分诊模式失败");
			renderJson(map);
			return;
		}
		//获取分诊台分针模式
		String type=rt.get("triage_type").toString();
		
		String pager_ip=shared.getIpAddr(getRequest());
		//查询患者信息
		List<Record> list=servicepatientqueue.list_call_patient_was(Integer.parseInt(queue_type_id),pager_ip,type,login_id);
		if(list.size()<1){
			map.put("return_code", "fail");
			map.put("return_msg", "没有未到过号患者");
			renderJson(map);
			return;
		}else{
			map.put("return_code", "success");
			map.put("return_msg", "获取未到过号患者信息成功");
			map.put("list", list);
			map.put("count", list.size());
			renderJson(map);
		}
		renderJson(map);
	}


	//顺序呼叫
	public void call_next(){
		Map<String, Object> map=new HashMap<String, Object>();
		Record rpager = pager.queryByPagetToIP(shared.getIpAddr(getRequest()));
	    if (rpager.get("doctor_id") == null)
	    {
	      map.put("return_code", "loginout");
	      map.put("return_msg", "loginout");
	      renderJson(map);
	      return;
	    }
	    int doctor_id=rpager.getInt("doctor_id");
		String queue_type_id=getPara("queue_type_id").toString();
		if(ToolString.isBlank(queue_type_id)){
			map.put("return_code", "fail");
			map.put("return_msg", "请传入队列id");
			renderJson(map);
			return;
		}
		String pager_ip=shared.getIpAddr(getRequest());
		if(ToolString.isBlank(pager_ip)){
			map.put("return_code", "fail");
			map.put("return_msg", "请传入叫号器ID");
			renderJson(map);
			return;
		}
		String login_id=getPara("login_id");
		if(ToolString.isBlank(login_id)){
			map.put("return_code", "fail");
			map.put("return_msg", "请传入登陆工号");
			renderJson(map);
			return;
		}	
		
		//分诊台分诊模式 triage_type 1按医生 2按叫号器
		//根据医生工号查询分诊台分诊模式
		Record rt= triage.findtypelogin_id(login_id);
		if(null==rt){
			map.put("return_code", "fail");
			map.put("return_msg", "查询分诊台分诊模式失败");
			renderJson(map);
			return;
		}
		//获取分诊台分针模式
		String type=rt.get("triage_type").toString();
		Record record= servicepatientqueue.call_next(queue_type_id, pager_ip, login_id,type,doctor_id);
		if(null==record){
			map.put("return_code", "fail");
			map.put("return_msg", "呼叫失败,无新患者");
			renderJson(map);
			return;
		}else{
			int id=record.getInt("id");
			if("".equals(id)){
				map.put("return_code", "fail");
				map.put("return_msg", "呼叫失败");
				renderJson(map);
				return;
			}
			int i=servicepatientqueue.update_patient_state(queue_type_id, pager_ip, login_id,id,type,doctor_id);
			if(i>0){
				map.put("return_code", "success");
				map.put("return_msg", "呼叫成功");
				map.put("list", record);
				map.put("patient_name", record.getStr("patient_name"));
				getSession().setAttribute("id", id);
				renderJson(map);
			}
		}
		renderJson(map);
	}
	//重新呼叫患者recall
	public void CallPatient(){
		Map<String, Object> map=new HashMap<String, Object>();
		Record rpager = pager.queryByPagetToIP(shared.getIpAddr(getRequest()));
	    if (rpager.get("doctor_id") == null)
	    {
	      map.put("return_code", "loginout");
	      map.put("return_msg", "loginout");
	      renderJson(map);
	      return;
	    }
	    int doctor_id=rpager.getInt("doctor_id");
		String login_id=getPara("login_id");
		if(ToolString.isBlank(login_id)){
			map.put("return_code", "fail");
			map.put("return_msg", "请填写登陆工号");
			renderJson(map);
			return;
		}
		
		String pager_ip=shared.getIpAddr(getRequest());
		if(ToolString.isBlank(pager_ip)){
			map.put("return_code", "fail");
			map.put("return_msg", "error");
			renderJson(map);
			return;
		}
		//分诊台分诊模式 triage_type 1按医生 2按叫号器
		//根据医生工号查询分诊台分诊模式
		Record rt= triage.findtypelogin_id(login_id);
		if(null==rt){
			map.put("return_code", "fail");
			map.put("return_msg", "查询分诊台分诊模式失败");
			renderJson(map);
			return;
		}
		//获取分诊台分针模式
		String type=rt.get("triage_type").toString();
		//获取当前叫号患者的id
		Record rd= servicepatientqueue.select_patient_queue_id(pager_ip, login_id,type);
		
		if(null==rd){
			map.put("return_code", "fail");
			map.put("return_msg", "patient_queue_id获取失败");
			renderJson(map);
			return;
		}
		int patient_queue_id=rd.getInt("id");
		Record record= servicepatientqueue.recall(patient_queue_id,pager_ip,login_id,type);
		if(null==record){
			map.put("return_code", "fail");
			map.put("return_msg", "重呼患者失败");
			renderJson(map);
			return;
		}else{
			String queue_type_id=getPara("queue_type_id").toString();
			String id=rd.get("id").toString();
			if (id == null)
		    {
		      map.put("return_code", "fail");
		      map.put("return_msg", "session获取失败");
		      renderJson(map);
		      return;
		    }
			int i=servicepatientqueue.update_patient_state(queue_type_id, pager_ip, login_id,Integer.parseInt(id),type,doctor_id);
			if(i>0){
				map.put("return_code", "success");
				map.put("return_msg", "重呼患者成功");
				map.put("list", record);
				getSession().setAttribute("id", patient_queue_id);
				renderJson(map);
			}
			
		}
		renderJson(map);
	}


	//SetPatientState 	更新患者状态-其中0代表未到过号；1代表已就诊) patient_queue_id state pager_ip login_id
	public void SetPatientState(){
		Map<String, Object> map=new HashMap<String, Object>();
		Record rpager = pager.queryByPagetToIP(shared.getIpAddr(getRequest()));
	    if (rpager.get("doctor_id") == null)
	    {
	      map.put("return_code", "loginout");
	      map.put("return_msg", "loginout");
	      renderJson(map);
	      return;
	    }
		String pager_ip=shared.getIpAddr(getRequest());
		if(ToolString.isBlank(pager_ip)){
			map.put("return_code", "fail");
			map.put("return_msg", "pager_ip不能为空");
			renderJson(map);
			return;
		}
		System.out.println(pager_ip);
		String login_id=getPara("login_id");
		if(ToolString.isBlank(login_id)){
			map.put("return_code", "fail");
			map.put("return_msg", "login_id不能为空");
			renderJson(map);
			return;
		}
		System.out.println(login_id);
		int state=getParaToInt("state",-1);
		if(-1==state){
			map.put("return_code", "fail");
			map.put("return_msg", "state不能为空");
			renderJson(map);
			return;
		}
		System.out.println(state);
		//分诊台分诊模式 triage_type 1按医生 2按叫号器
		//根据医生工号查询分诊台分诊模式
		Record rt= triage.findtypelogin_id(login_id);
		if(null==rt){
			map.put("return_code", "fail");
			map.put("return_msg", "查询分诊台分诊模式失败");
			renderJson(map);
			return;
		}
		//获取分诊台分针模式
		String type=rt.get("triage_type").toString();
		//获取当前叫号患者的id
		Record rd= servicepatientqueue.select_patient_queue_id(pager_ip, login_id,type);
		if(null==rd){
			map.put("return_code", "fail");
			map.put("return_msg", "patient_queue_id获取失败");
			renderJson(map);
			return;
		}
		int patient_queue_id=rd.getInt("id");
		System.out.println(patient_queue_id);
		int num= servicepatientqueue.SetPatientState(patient_queue_id, pager_ip, login_id, state,type);
		if(num<0){
			map.put("return_code", "fail");
			map.put("return_msg", "更新患者状态失败");
			renderJson(map);
			return;
		}else{
			map.put("return_code", "success");
			map.put("return_msg", "更新患者状态成功");
			renderJson(map);
		}
		renderJson(map);
	}


	//患者选择呼叫
	public void call_select(){
		Map<String, Object> map=new HashMap<String, Object>();
		Record rpager = pager.queryByPagetToIP(shared.getIpAddr(getRequest()));
	    if (null==rpager.get("doctor_id"))
	    {
	      map.put("return_code", "loginout");
	      map.put("return_msg", "loginout");
	      renderJson(map);
	      return;
	    }
	    int doctor_id=rpager.getInt("doctor_id");
	    
		String patient_queue_id=getPara("patient_queue_id");
		if(ToolString.isBlank(patient_queue_id)){
			map.put("return_code", "fail");
			map.put("return_msg", "patient_queue_id不能为空");
			renderJson(map);
			return;
		}
		String queue_type_id=getPara("queue_type_id");
		System.out.println(queue_type_id);
		if(ToolString.isBlank(queue_type_id)){
			map.put("return_code", "fail");
			map.put("return_msg", "queue_type_id不能为空");
			renderJson(map);
			return;
		}
		String login_id=getPara("login_id");
		if(ToolString.isBlank(login_id)){
			map.put("return_code", "fail");
			map.put("return_msg", "login_id不能为空");
			renderJson(map);
			return;
		}
		String pager_ip=shared.getIpAddr(getRequest());
		if(ToolString.isBlank(pager_ip)){
			map.put("return_code", "fail");
			map.put("return_msg", "pager_id不能为空");
			renderJson(map);
			return;
		}
		//分诊台分诊模式 triage_type 1按医生 2按叫号器
		//根据医生工号查询分诊台分诊模式
		Record rt= triage.findtypelogin_id(login_id);
		if(null==rt){
			map.put("return_code", "fail");
			map.put("return_msg", "查询分诊台分诊模式失败");
			renderJson(map);
			return;
		}
		//获取分诊台分针模式
		String type=rt.get("triage_type").toString();
		Record record= servicepatientqueue.call_select(patient_queue_id, queue_type_id, pager_ip, login_id);
		if(null==record){
			map.put("return_code", "fail");
			map.put("return_msg", "呼叫失败,无新患者");
			renderJson(map);
			return;
		}else{
			int id=record.getInt("id");
			if("".equals(id)){
				map.put("return_code", "fail");
				map.put("return_msg", "呼叫失败");
				renderJson(map);
				return;
			}
			int i=servicepatientqueue.update_patient_state(queue_type_id, pager_ip, login_id,id,type,doctor_id);
			if(i>0){
				map.put("return_code", "success");
				map.put("return_msg", "呼叫成功");
				map.put("list", record);
				renderJson(map);
			}
		}
		renderJson(map);
	}
	
	public void list_patient_wait(){
		 Map<String, Object> map=new HashMap<String, Object>();
		String ip=getPara("ip");
		String[] aa=new String[0];
		
		if(ToolString.isBlank(ip)){
			map.put("return_code", "fail");
			 map.put("return_msg", "获取ip失败");
			 map.put("count", 0);
			 map.put("fztname", "未知");
			 map.put("list", aa);
			 renderJson(map);
			 return;
		}
		
		Record r= triage.findByTriageName(ip);
		if(null==r){
			 map.put("return_code", "fail");
			 map.put("return_msg", "查询失败");
			 map.put("fztname", "未知");
			 map.put("list", aa);
			 renderJson(map);
			 return;
		 }
		 List<Record> lt= queuetype.list_queue_type(ip);
		 if(lt.size()==0){
			 map.put("return_code", "fail");
			 map.put("return_msg", "没有队列");
			 map.put("fztname", r.get("name"));
			 map.put("list", aa);
			 renderJson(map);
			 return;
		 }
		 
		
		//等候人
		//List<Record> list=servicepatientqueue.list_patient_wait(ip);
			
			
		 String  json="{\"count\":"+lt.size()+",\"fztname\":\""+r.getStr("name")+"\",\"list\":[";
		for(Record rd:lt){
			//当前就诊人
			Record dqjzr= servicepatientqueue.list_patient_visit(rd.get("queue_type_id").toString());
			try {
				json +="{\"jz_name\":\"("+dqjzr.get("register_id")+")"+dqjzr.get("patient_name")+"\",\"jzbh\":\""+dqjzr.get("register_id")+"\",";
			} catch (Exception e) {
				json +="{\"jz_name\":\"\",\"jzbh\":\"\",";
			}
			//等候人
			List<Record> top10= servicepatientqueue.querydgtop10(rd.get("queue_type_id").toString());
			for(int i=0;i<10;i++){
		 		try {
		 			json += "\"dh_name"+i+"" +"\":\"("+top10.get(i).get("register_id")+")"+top10.get(i).get("patient_name")+"\",";
				} catch (Exception e) {
					json +="\"dh_name"+i+"" +"\":\"\",";
				}
		 	}
			//去除最后一个逗号
			json= json.substring(0,json.length()-1);
			
			json += ",\"zsmc\":\""+rd.get("name")+"\"";
			
			json+="},";
			
		}
		json= json.substring(0,json.length()-1);
		json+="]}";
		 
		renderJson(json);
	}
	

	
	
	
	
	
	
	
	
	
	
	
	
}
